﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.IO;
using Common;
using WFNetLib;
using System.Threading;

namespace 生命体征测试仪
{
    public partial class formGetID : formBase
    {
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
        public struct IDCardData
        {
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
            public string Name; //姓名   
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 6)]
            public string Sex;   //性别
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
            public string Nation; //名族
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 18)]
            public string Born; //出生日期
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 72)]
            public string Address; //住址
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 38)]
            public string IDCardNo; //身份证号
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
            public string GrantDept; //发证机关
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 18)]
            public string UserLifeBegin; // 有效开始日期
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 18)]
            public string UserLifeEnd;  // 有效截止日期
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 38)]
            public string reserved; // 保留
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 255)]
            public string PhotoFileName; // 照片路径
        }
        /************************端口类API *************************/
        [DllImport(".\\新中新身份证\\SynIDCardAPI.dll", EntryPoint = "Syn_SetMaxRFByte", CharSet = CharSet.Ansi)]
        public static extern int Syn_SetMaxRFByte(int iPort, byte ucByte, int iIfOpen);
        [DllImport(".\\新中新身份证\\SynIDCardAPI.dll", EntryPoint = "Syn_GetCOMBaud", CharSet = CharSet.Ansi)]
        public static extern int Syn_GetCOMBaud(int iPort, ref uint puiBaudRate);
        [DllImport(".\\新中新身份证\\SynIDCardAPI.dll", EntryPoint = "Syn_SetCOMBaud", CharSet = CharSet.Ansi)]
        public static extern int Syn_SetCOMBaud(int iPort, uint uiCurrBaud, uint uiSetBaud);
        [DllImport(".\\新中新身份证\\SynIDCardAPI.dll", EntryPoint = "Syn_OpenPort", CharSet = CharSet.Ansi)]
        public static extern int Syn_OpenPort(int iPort);
        [DllImport(".\\新中新身份证\\SynIDCardAPI.dll", EntryPoint = "Syn_ClosePort", CharSet = CharSet.Ansi)]
        public static extern int Syn_ClosePort(int iPort);
        /**************************SAM类函数 **************************/
        [DllImport(".\\新中新身份证\\SynIDCardAPI.dll", EntryPoint = "Syn_ResetSAM", CharSet = CharSet.Ansi)]
        public static extern int Syn_ResetSAM(int iPort, int iIfOpen);
        [DllImport(".\\新中新身份证\\SynIDCardAPI.dll", EntryPoint = "Syn_GetSAMStatus", CharSet = CharSet.Ansi)]
        public static extern int Syn_GetSAMStatus(int iPort, int iIfOpen);
        [DllImport(".\\新中新身份证\\SynIDCardAPI.dll", EntryPoint = "Syn_GetSAMID", CharSet = CharSet.Ansi)]
        public static extern int Syn_GetSAMID(int iPort, ref byte pucSAMID, int iIfOpen);
        [DllImport(".\\新中新身份证\\SynIDCardAPI.dll", EntryPoint = "Syn_GetSAMIDToStr", CharSet = CharSet.Ansi)]
        public static extern int Syn_GetSAMIDToStr(int iPort, ref byte pcSAMID, int iIfOpen);
        /*************************身份证卡类函数 ***************************/
        [DllImport(".\\新中新身份证\\SynIDCardAPI.dll", EntryPoint = "Syn_StartFindIDCard", CharSet = CharSet.Ansi)]
        public static extern int Syn_StartFindIDCard(int iPort, ref byte pucIIN, int iIfOpen);
        [DllImport(".\\新中新身份证\\SynIDCardAPI.dll", EntryPoint = "Syn_SelectIDCard", CharSet = CharSet.Ansi)]
        public static extern int Syn_SelectIDCard(int iPort, ref byte pucSN, int iIfOpen);
        [DllImport(".\\新中新身份证\\SynIDCardAPI.dll", EntryPoint = "Syn_ReadBaseMsg", CharSet = CharSet.Ansi)]
        public static extern int Syn_ReadBaseMsg(int iPort, ref byte pucCHMsg, ref uint puiCHMsgLen, ref byte pucPHMsg, ref uint puiPHMsgLen, int iIfOpen);
        [DllImport(".\\新中新身份证\\SynIDCardAPI.dll", EntryPoint = "Syn_ReadIINSNDN", CharSet = CharSet.Ansi)]
        public static extern int Syn_ReadIINSNDN(int iPort, ref byte pucIINSNDN, int iIfOpen);
        [DllImport(".\\新中新身份证\\SynIDCardAPI.dll", EntryPoint = "Syn_ReadBaseMsgToFile", CharSet = CharSet.Ansi)]
        public static extern int Syn_ReadBaseMsgToFile(int iPort, ref byte pcCHMsgFileName, ref uint puiCHMsgFileLen, ref byte pcPHMsgFileName, ref uint puiPHMsgFileLen, int iIfOpen);
        [DllImport(".\\新中新身份证\\SynIDCardAPI.dll", EntryPoint = "Syn_ReadIINSNDNToASCII", CharSet = CharSet.Ansi)]
        public static extern int Syn_ReadIINSNDNToASCII(int iPort, ref byte pucIINSNDN, int iIfOpen);
        [DllImport(".\\新中新身份证\\SynIDCardAPI.dll", EntryPoint = "Syn_ReadNewAppMsg", CharSet = CharSet.Ansi)]
        public static extern int Syn_ReadNewAppMsg(int iPort, ref byte pucAppMsg, ref uint puiAppMsgLen, int iIfOpen);
        [DllImport(".\\新中新身份证\\SynIDCardAPI.dll", EntryPoint = "Syn_GetBmp", CharSet = CharSet.Ansi)]
        public static extern int Syn_GetBmp(int iPort, ref byte Wlt_File);
        [DllImport(".\\新中新身份证\\SynIDCardAPI.dll", EntryPoint = "Syn_ReadMsg", CharSet = CharSet.Ansi)]
        public static extern int Syn_ReadMsg(int iPortID, int iIfOpen, ref IDCardData pIDCardData);
        [DllImport(".\\新中新身份证\\SynIDCardAPI.dll", EntryPoint = "Syn_FindReader", CharSet = CharSet.Ansi)]
        public static extern int Syn_FindReader();
        /***********************设置附加功能函数 ************************/
        [DllImport(".\\新中新身份证\\SynIDCardAPI.dll", EntryPoint = "Syn_SetPhotoPath", CharSet = CharSet.Ansi)]
        public static extern int Syn_SetPhotoPath(int iOption, ref byte cPhotoPath);
        [DllImport(".\\新中新身份证\\SynIDCardAPI.dll", EntryPoint = "Syn_SetPhotoType", CharSet = CharSet.Ansi)]
        public static extern int Syn_SetPhotoType(int iType);
        [DllImport(".\\新中新身份证\\SynIDCardAPI.dll", EntryPoint = "Syn_SetPhotoName", CharSet = CharSet.Ansi)]
        public static extern int Syn_SetPhotoName(int iType);
        [DllImport(".\\新中新身份证\\SynIDCardAPI.dll", EntryPoint = "Syn_SetSexType", CharSet = CharSet.Ansi)]
        public static extern int Syn_SetSexType(int iType);
        [DllImport(".\\新中新身份证\\SynIDCardAPI.dll", EntryPoint = "Syn_SetNationType", CharSet = CharSet.Ansi)]
        public static extern int Syn_SetNationType(int iType);
        [DllImport(".\\新中新身份证\\SynIDCardAPI.dll", EntryPoint = "Syn_SetBornType", CharSet = CharSet.Ansi)]
        public static extern int Syn_SetBornType(int iType);
        [DllImport(".\\新中新身份证\\SynIDCardAPI.dll", EntryPoint = "Syn_SetUserLifeBType", CharSet = CharSet.Ansi)]
        public static extern int Syn_SetUserLifeBType(int iType);
        [DllImport(".\\新中新身份证\\SynIDCardAPI.dll", EntryPoint = "Syn_SetUserLifeEType", CharSet = CharSet.Ansi)]
        public static extern int Syn_SetUserLifeEType(int iType, int iOption);
        public formGetID()
        {
            InitializeComponent();
        }
        public bool bIDOk;
        int leftTime;
        private void formGetID_Load(object sender, EventArgs e)
        {
            skinLabel1.Text = "初始化设备中......";
            axShockwaveFlash1.Movie = AppDomain.CurrentDomain.BaseDirectory + "刷身份证.swf";
            Thread t = new Thread(ThreadServer);
            t.Start();
            timer1.Enabled = true;
            leftTime = 60;
        }
        void ThreadServer()
        {
            string stmp;
            int i, nRet;
            uint[] iBaud = new uint[1];
            i = Syn_FindReader();
            if (i > 0)
            {
                this.Invoke((EventHandler)(delegate
                {
                    IDPort = i;
                    if (i > 1000)
                    {
                        //button3.Enabled = false;
                        //textBox3.Enabled = false;
                        stmp = Convert.ToString(i);
                        //textBox1.Text = stmp;
                        stmp = Convert.ToString(System.DateTime.Now) + "  读卡器连接在USB " + stmp;
                        //listBox1.Items.Add(stmp);
                    }
                    else
                    {
                        System.Threading.Thread.Sleep(200);
                        nRet = Syn_GetCOMBaud(i, ref iBaud[0]);
                        //button3.Enabled = true;
                        //textBox3.Enabled = true;
                        stmp = Convert.ToString(i);
                        //textBox1.Text = stmp;
                        //textBox3.Text = Convert.ToString(iBaud[0]);
                        stmp = Convert.ToString(System.DateTime.Now) + "  读卡器连接在COM " + stmp + ";当前波特率为 " + Convert.ToString(iBaud[0]);
                        //listBox1.Items.Add(stmp);

                    }
                    byte[] cPath = new byte[255];
                    stmp = AppDomain.CurrentDomain.BaseDirectory + "IDPic";
                    cPath = System.Text.Encoding.Default.GetBytes(stmp);
                    nRet = Syn_SetPhotoPath(2, ref cPath[0]);
                    skinLabel1.Text = "请刷身份证";
                    timer2.Enabled = true;

                    nRet = Syn_SetPhotoName(2);//照片保存文件名格式设置为 身份证号
                    stmp = System.Windows.Forms.Application.StartupPath + "\\身份证照片";
                    FileInfo f = new FileInfo(stmp + "\\1.bin");
                    // 如果文件所在的文件夹不存在则创建文件夹
                    if (!Directory.Exists(f.DirectoryName))
                        Directory.CreateDirectory(f.DirectoryName);
                    cPath = System.Text.Encoding.Default.GetBytes(stmp);
                    nRet = Syn_SetPhotoPath(2, ref cPath[0]);

                    nRet = Syn_SetPhotoType(1);//照片存放格式为Jpeg
                    leftTime=60;
                    skinLabel2.Text = leftTime.ToString();
                }));
                
            }
            else
            {
                this.Invoke((EventHandler)(delegate
                {
                    stmp = "没有找到身份证读卡器";
                    MessageBox.Show(stmp);
                    bIDOk = false;
                    this.Close();                    
                }));
            }  
        }
        private void skinButton1_Click(object sender, EventArgs e)
        {
            bIDOk=false;
            this.Close();
        }
        int IDPort;
        private void timer1_Tick(object sender, EventArgs e)
        {
            leftTime--;
            skinLabel2.Text = leftTime.ToString();
            if (leftTime == 0)
            {
                this.Close();
            }
//             string stmp;
//             int i, nRet;
//             uint[] iBaud = new uint[1];
//             i = Syn_FindReader();
//             if (i > 0)
//             {
//                 IDPort = i;
//                 if (i > 1000)
//                 {
//                     //button3.Enabled = false;
//                     //textBox3.Enabled = false;
//                     stmp = Convert.ToString(i);
//                     //textBox1.Text = stmp;
//                     stmp = Convert.ToString(System.DateTime.Now) + "  读卡器连接在USB " + stmp;
//                     //listBox1.Items.Add(stmp);
//                 }
//                 else
//                 {
//                     System.Threading.Thread.Sleep(200);
//                     nRet = Syn_GetCOMBaud(i, ref iBaud[0]);
//                     //button3.Enabled = true;
//                     //textBox3.Enabled = true;
//                     stmp = Convert.ToString(i);
//                     //textBox1.Text = stmp;
//                     //textBox3.Text = Convert.ToString(iBaud[0]);
//                     stmp = Convert.ToString(System.DateTime.Now) + "  读卡器连接在COM " + stmp + ";当前波特率为 " + Convert.ToString(iBaud[0]);
//                     //listBox1.Items.Add(stmp);
// 
//                 }                
//                 byte[] cPath = new byte[255];
//                 stmp = AppDomain.CurrentDomain.BaseDirectory+"IDPic";
//                 cPath = System.Text.Encoding.Default.GetBytes(stmp);
//                 nRet = Syn_SetPhotoPath(2, ref cPath[0]);                
//                 skinLabel1.Text = "请刷身份证";
//                 timer2.Enabled = true;
// 
//                 nRet = Syn_SetPhotoName(2);//照片保存文件名格式设置为 身份证号
//                 stmp = System.Windows.Forms.Application.StartupPath + "\\身份证照片";
//                 FileInfo f = new FileInfo(stmp+"\\1.bin");
//                 // 如果文件所在的文件夹不存在则创建文件夹
//                 if (!Directory.Exists(f.DirectoryName))
//                     Directory.CreateDirectory(f.DirectoryName);                
//                 cPath = System.Text.Encoding.Default.GetBytes(stmp);
//                 nRet = Syn_SetPhotoPath(2, ref cPath[0]);
// 
//                 nRet = Syn_SetPhotoType(1);//照片存放格式为Jpeg
//             }
//             else
//             {
//                 stmp = "没有找到身份证读卡器";
//                 MessageBox.Show(stmp);
//                 bIDOk = false;
//                 this.Close();
//                 //listBox1.Items.Add(stmp);
//             }            
        }
        public IDCardData CardMsg;
        private void timer2_Tick(object sender, EventArgs e)
        {
            timer2.Enabled = false;
            CardMsg = new IDCardData();
            int nRet, nPort;
            string stmp;
            byte[] pucIIN = new byte[4];
            byte[] pucSN = new byte[8];
            nPort = IDPort;
            Syn_SetSexType(1);
            Syn_SetNationType(1);
            Syn_SetBornType(1);
            Syn_SetUserLifeBType(1);
            Syn_SetUserLifeEType(1, 1);
            if (Syn_OpenPort(nPort) == 0)
            {
                if (Syn_SetMaxRFByte(nPort, 80, 0) == 0)
                {
                    nRet = Syn_StartFindIDCard(nPort, ref pucIIN[0], 0);
                    nRet = Syn_SelectIDCard(nPort, ref pucSN[0], 0);
                    nRet = Syn_ReadMsg(nPort, 0, ref CardMsg);
                    if (nRet == 0)
                    {
                        stmp = Convert.ToString(System.DateTime.Now) + "  姓名:" + CardMsg.Name;
                        //listBox1.Items.Add(stmp);
                        stmp = Convert.ToString(System.DateTime.Now) + "  性别:" + CardMsg.Sex;
                        //listBox1.Items.Add(stmp);
                        stmp = Convert.ToString(System.DateTime.Now) + "  民族:" + CardMsg.Nation;
                        //listBox1.Items.Add(stmp);
                        stmp = Convert.ToString(System.DateTime.Now) + "  出生日期:" + CardMsg.Born;
                        //listBox1.Items.Add(stmp);
                        stmp = Convert.ToString(System.DateTime.Now) + "  地址:" + CardMsg.Address;
                        //listBox1.Items.Add(stmp);
                        stmp = Convert.ToString(System.DateTime.Now) + "  身份证号:" + CardMsg.IDCardNo;
                        //listBox1.Items.Add(stmp);
                        stmp = Convert.ToString(System.DateTime.Now) + "  发证机关:" + CardMsg.GrantDept;
                        //listBox1.Items.Add(stmp);
                        stmp = Convert.ToString(System.DateTime.Now) + "  有效期开始:" + CardMsg.UserLifeBegin;
                        //listBox1.Items.Add(stmp);
                        stmp = Convert.ToString(System.DateTime.Now) + "  有效期结束:" + CardMsg.UserLifeEnd;
                        //listBox1.Items.Add(stmp);
                        stmp = Convert.ToString(System.DateTime.Now) + "  照片文件名:" + CardMsg.PhotoFileName;
                        //listBox1.Items.Add(stmp);      
                        formMain.curUser = new UserInfoData();
                        formMain.curUser.ID = CardMsg.IDCardNo.Trim();
                        formMain.curUser.Name = CardMsg.Name.Trim();
                        formMain.curUser.Sex = CardMsg.Sex.Trim();
                        formMain.curUser.Nation = CardMsg.Nation.Trim();
                        formMain.curUser.Address = CardMsg.Address.Trim();
                        formMain.curUser.GrantDept = CardMsg.GrantDept.Trim();
                        formMain.curUser.Born = CardMsg.Born.Trim();
                        formMain.curUser.UserLifeBegin = CardMsg.UserLifeBegin.Trim();
                        formMain.curUser.UserLifeEnd = CardMsg.UserLifeEnd.Trim();
                        formMain.PhotoFileName = CardMsg.PhotoFileName.Trim();
                        bIDOk = true;
                        this.Close();
                    }
                    else
                    {
                        stmp = Convert.ToString(System.DateTime.Now) + "  读取身份证信息错误";
                        timer2.Enabled = true;
                        //listBox1.Items.Add(stmp);
                    }
                }
            }
            else
            {
                stmp = "身份证读卡器打开端口失败";
                MessageBox.Show(stmp);
                bIDOk = false;
                this.Close();
            }
        }
    }
}
